//////////////////////////////////////////////////////////////////////////////////	 
//
//  文 件 名   : WaterConfig.c
//  版 本 号   : 1.0
//  作    者   : Wsy
//  生成日期   : 2024/3/13
//  邮箱       : 18269214440@163.com
//  功能描述   : 初始化流水的函数代码
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////

#include "Water.h"
#include "delay.h"


//所有流水灯的初始化
void WaterLed_Config(void)
{
  //1.新建结构体变量
	GPIO_InitTypeDef  GPIO_InitStructure_d;
	GPIO_InitTypeDef  GPIO_InitStructure_e;
	
  	//2.打开GPIO端口时钟  PD  和  PE
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	//3.配置GPIO引脚并初始化
	GPIO_InitStructure_d.GPIO_Pin 	= GPIO_Pin_15 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_10 |
	                                  GPIO_Pin_4 | GPIO_Pin_14 | GPIO_Pin_0 | GPIO_Pin_9 ;				//引脚编号
	GPIO_InitStructure_d.GPIO_Mode 	= GPIO_Mode_OUT;			 //输出模式
	GPIO_InitStructure_d.GPIO_Speed = GPIO_Speed_100MHz;   //输出速率
	GPIO_InitStructure_d.GPIO_OType = GPIO_OType_PP;		   //推挽输出
	GPIO_InitStructure_d.GPIO_PuPd 	= GPIO_PuPd_NOPULL ;	 //不拉电阻
	GPIO_Init(GPIOD, &GPIO_InitStructure_d); 
	
	//********************配置GPIOE端口
	GPIO_InitStructure_e.GPIO_Pin 	= GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_12 | GPIO_Pin_14  | GPIO_Pin_7  |
	                                  GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_15;				//引脚编号
	GPIO_InitStructure_e.GPIO_Mode 	= GPIO_Mode_OUT;			//输出模式
	GPIO_InitStructure_e.GPIO_Speed = GPIO_Speed_100MHz;//输出速率
	GPIO_InitStructure_e.GPIO_OType = GPIO_OType_PP;		//推挽输出
	GPIO_InitStructure_e.GPIO_PuPd 	= GPIO_PuPd_NOPULL ;		//不拉电阻
	GPIO_Init(GPIOE, &GPIO_InitStructure_e); 

}

//按键的初始化
void Key_Config(void)
{
	
	GPIO_InitTypeDef  GPIO_InitStructure1;
	
	//1.打开GPIO按键时钟 
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

		/* 2初始化后前面第一个按键引脚*/
	GPIO_InitStructure1.GPIO_Mode 	= GPIO_Mode_IN;
	GPIO_InitStructure1.GPIO_PuPd 	= GPIO_PuPd_NOPULL;
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_0;

	GPIO_Init(GPIOA, &GPIO_InitStructure1);
	
		/* 3初始化后前面三个按键引脚*/
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;

	GPIO_Init(GPIOE, &GPIO_InitStructure1);

}


//关机函数，让流水灯全部关掉
void Stop_System(void)
{
   GPIOD->BSRRL = LEFT_D1;       //左1
	 GPIOD->BSRRL = LEFT_D2;       //左2
	 GPIOE->BSRRL = LEFT_E3;       //左3
   GPIOE->BSRRL = LEFT_E4;       //左4
   GPIOE->BSRRL = LEFT_E5;       //左5
	 GPIOE->BSRRL = LEFT_E6;       //左6
	 GPIOD->BSRRL = LEFT_D7;       //左7
	 GPIOD->BSRRL = LEFT_D8;       //左8
	
	 GPIOD->BSRRL = RIGHT_D1;      //右1
	 GPIOD->BSRRL = RIGHT_D2;      //右2
	 GPIOE->BSRRL = RIGHT_E3;      //右3
	 GPIOE->BSRRL = RIGHT_E4;      //右4
	 GPIOE->BSRRL = RIGHT_E5;      //右5
	 GPIOE->BSRRL = RIGHT_E6;      //右6
	 GPIOE->BSRRL = RIGHT_E7;      //右7
	 GPIOD->BSRRL = RIGHT_D8;      //右8
}

//开灯函数，让流水灯全部开
void Start_Led(void)
{
   GPIOD->BSRRH = LEFT_D1;       //左1
	 GPIOD->BSRRH = LEFT_D2;       //左2
	 GPIOE->BSRRH = LEFT_E3;       //左3
   GPIOE->BSRRH = LEFT_E4;       //左4
   GPIOE->BSRRH = LEFT_E5;       //左5
	 GPIOE->BSRRH = LEFT_E6;       //左6
	 GPIOD->BSRRH = LEFT_D7;       //左7
	 GPIOD->BSRRH = LEFT_D8;       //左8
	
	 GPIOD->BSRRH = RIGHT_D1;      //右1
	 GPIOD->BSRRH = RIGHT_D2;      //右2
	 GPIOE->BSRRH = RIGHT_E3;      //右3
	 GPIOE->BSRRH = RIGHT_E4;      //右4
	 GPIOE->BSRRH = RIGHT_E5;      //右5
	 GPIOE->BSRRH = RIGHT_E6;      //右6
	 GPIOE->BSRRH = RIGHT_E7;      //右7
	 GPIOD->BSRRH = RIGHT_D8;      //右8
}

//选择函数，通过当前的选择来控制哪个灯亮
void Seclet_Mode(int a)
{
   switch(a)
	 {
		 case 1:
			 //如果是1则是第一个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOD->BSRRL = RIGHT_D8;     //右8
		 
		  GPIOD->BSRRH = LEFT_D1;      //左1
		 
		  GPIOD->BSRRL = LEFT_D2;       //左2
		  
		  break;
		 
		 case 2:
			 //如果是2则是第2个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOD->BSRRL = LEFT_D1;      //左1
		 
		  GPIOD->BSRRH = LEFT_D2;      //左2
		 
		  GPIOE->BSRRL = LEFT_E3;       //左3
		  
		  break;
		 
		 case 3:
			 //如果是3则是第3个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOD->BSRRL = LEFT_D2;       //左2
		 
		  GPIOE->BSRRH = LEFT_E3;       //左3
		 
		  GPIOE->BSRRL = LEFT_E4;       //左4
		  
		  break;
		 
		 case 4:
			 //如果是4则是第4个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOE->BSRRL = LEFT_E3;       //左3
		 
		  GPIOE->BSRRH = LEFT_E4;       //左4
		 
		  GPIOE->BSRRL = LEFT_E5;       //左5
		  
		  break;
		 
		 case 5:
			 //如果是一则是第一个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  

		  GPIOE->BSRRL = LEFT_E4;       //左4
		 
		  GPIOE->BSRRH = LEFT_E5;       //左5
		 
		  GPIOE->BSRRL = LEFT_E6;       //左6
		  
		  break;
		 
		 case 6:
			 //如果是一则是第一个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOE->BSRRL = LEFT_E5;       //左5
		 
		  GPIOE->BSRRH = LEFT_E6;       //左6
		 
		  GPIOD->BSRRL = LEFT_D7;       //左7
		  
		  break;
		 
		 case 7:
			 //如果是7则是第7个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOE->BSRRL = LEFT_E6;     //左6
		 
		  GPIOD->BSRRH = LEFT_D7;      //左7
		 
		  GPIOD->BSRRL = LEFT_D8;       //左8
		  
		  break;
		 
		 case 8:
			 //如果是8则是第8个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
		  
		  GPIOD->BSRRL = LEFT_D7;        //左7
		 
		  GPIOD->BSRRH = LEFT_D8;        //左8
		 
		  GPIOD->BSRRL = RIGHT_D1;       //右1
		  
		  break;
		 
		 //******************************右边这一排的灯******************************
		 case 9:
			 //如果是9则是第9个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOD->BSRRL = LEFT_D8;        //左8
		 
		  GPIOD->BSRRH = RIGHT_D1;       //右1
		 
		  GPIOD->BSRRL = RIGHT_D2;       //右2
		  
		  break;
		 
		 case 10:
			 //如果是10则是第10个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOD->BSRRL = RIGHT_D1;        //右1
		 
		  GPIOD->BSRRH = RIGHT_D2;        //右2
		 
		  GPIOE->BSRRL = RIGHT_E3;        //右3
		  
		  break;
		 
		 case 11:
			 //如果是11则是第11个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOD->BSRRL = RIGHT_D2;        //右2
		 
		  GPIOE->BSRRH = RIGHT_E3;        //右3
		 
		  GPIOE->BSRRL = RIGHT_E4;        //右4
		  
		  break;
		 
		 case 12:
			 //如果是12则是第12个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOE->BSRRL = RIGHT_E3;        //右3
		 
		  GPIOE->BSRRH = RIGHT_E4;        //右4
		 
		  GPIOE->BSRRL = RIGHT_E5;        //右5
		  
		  break;

		  	 case 13:
			 //如果是13则是第13个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
		  GPIOE->BSRRL = RIGHT_E4;        //右4
		 
		  GPIOE->BSRRH = RIGHT_E5;        //右5
		 
		  GPIOE->BSRRL = RIGHT_E6;        //右6
		  
		  break;
				 
				 
			case 14:
			 //如果是14则是第14个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
			
	    GPIOE->BSRRL = RIGHT_E5;        //右5
		 
		  GPIOE->BSRRH = RIGHT_E6;        //右6
		 
		  GPIOE->BSRRL = RIGHT_E7;        //右7
		  
		  break;
			
			
			 case 15:
			 //如果是15则是第15个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
			 
	    GPIOE->BSRRL = RIGHT_E6;        //右6
		 
		  GPIOE->BSRRH = RIGHT_E7;        //右7
		 
		  GPIOD->BSRRL = RIGHT_D8;        //右8
		  
		  break;
			 
			 
			case 16:
			 //如果是16则是第16个灯亮，其它都不亮,则需要把它的上一个和下一个关掉即可
	  
			GPIOE->BSRRL = RIGHT_E7;        //右7
		 
		  GPIOD->BSRRH = RIGHT_D8;        //右8
		 
		  GPIOD->BSRRL = LEFT_D1;         //左1
		  
		  break;
			
			
		 default:
			GPIOD->BSRRL = RIGHT_D8;        //右8
		 
		  GPIOD->BSRRL = LEFT_D2;         //左2
		 break;
	 
	 
	 }
}

///开机函数，将流水灯依次亮灭几轮
void Start_System(void)
{
	  int cnt = 48, i=0, tm = 50;
    while(cnt--)
		{
			i = i < 16 ? ++i : 1;
		   Seclet_Mode(i);
			 delay_ms(tm++);
		}
		Stop_System();           //灯光全关
		Seclet_Mode(1);          //默认是1


}

//天然气传感器的初始化
void NaturalGas_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	
	//1.打开ADC外设的接口时钟  PA4 -- ADC1_IN4
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	//2.打开GPIO端口时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	//3.配置GPIO引脚参数+初始化 注意：引脚模式为模拟模式
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//4.配置ADC外设的参数
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;										//独立模式
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;									//预分频值  84MHZ /2 = 42MHZ
	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;			//不使用DMA
	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两次采样的间隔时间
	ADC_CommonInit(&ADC_CommonInitStructure);
	
	//5.配置ADC外设的转换精度、数据对齐
	ADC_InitStructure.ADC_Resolution 		= ADC_Resolution_12b;										//转换精度  12bit
	ADC_InitStructure.ADC_ScanConvMode 	= DISABLE;															//不扫描
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;													//不连续转换
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //不使用外部触发源
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;											//数据对齐  右对齐
	ADC_InitStructure.ADC_NbrOfConversion = 1;																	//转换序号
	ADC_Init(ADC1, &ADC_InitStructure);
	
	//6.配置ADC的规则通道  总转换时间 = 3 + 12 = 15周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_3Cycles);  

	//7.使能ADC
	ADC_Cmd(ADC1, ENABLE);

}

